

import java.io.*;
import java.net.*;
import java.util.HashMap;
import java.util.StringTokenizer;
import java.util.Map;

import network.Protocol;


import static stale.Stale.*;



public class Client implements Runnable {

	    private Socket socket = null;
	    private BufferedReader input;
	    private PrintWriter output;
	    //private OknoGlowne okno;
	    public Client(String host, String port) throws Exception {
	    	//this.okno = okno;
	        try {
	            socket = new Socket(host, Integer.parseInt(port));
	        } catch (UnknownHostException e) {
	            throw new Exception("Unknown host.");
	        } catch (IOException e) {
	            throw new Exception("IO exception while connecting to the server.");
	        } catch (NumberFormatException e) {
	            throw new Exception("Port value must be a number.");
	        }
	        try {
	            input = new BufferedReader(new InputStreamReader(socket
	                    .getInputStream()));
	            output = new PrintWriter(socket.getOutputStream(), true);
	        } catch (IOException ex) {
	            throw new Exception("Can not get input/output connection stream.");
	        }
	        new Thread(this).start();
	        send(Protocol.KE_ZALOGUJ);
	    }

	    synchronized boolean isDisconnected() {
	        return socket == null;
	    }

	    public void run() {
	        while (true)
	            try {
	                String command = input.readLine();
	                if (!handleCommand(command)) {
	                    output.close();
	                    input.close();
	                    socket.close();
	                    break;
	                }
	            } catch (IOException e) {
	            }
	        output = null;
	        input = null;
	        synchronized (this) {
	            socket = null;
	        }
	    }

	    private boolean handleCommand(String command) {
	        StringTokenizer st = new StringTokenizer(command);
	        String cd = st.nextToken();
	        if (cd.equals(Protocol.KE_ZALOGOWALEM)) {
	            
	        } else if (cd.equals(Protocol.PARAM_PREDKOSCI_TO)) {
	        	uaktualnijPredkoscKe(Double.parseDouble(command.split(" ")[1])); 
	        	uaktualnijPredkoscWrog(Double.parseDouble(command.split(" ")[2]));
	        } else if (cd.equals(Protocol.PARAM_ZYCIA_TO)) {
	        	uaktualnijIloscZyc(Integer.parseInt(command.split(" ")[1]));
	        } else if (cd.equals(Protocol.TOP_LISTA_TO)) {
	            Map<Integer,String> topMapa = new HashMap<Integer,String>();
	            for(int i =0; i<10; i++){
	            	topMapa.put(Integer.parseInt(st.nextToken()), st.nextToken()+st.nextToken());
	            }
	            uaktualnijTopLista(topMapa);
		    } else if (cd.equals(Protocol.TOP_AKCEPTUJE)) {
		           
			} else if (cd.equals(Protocol.MAPA_DAJE_POZIOM)) {
				StringTokenizer com = new StringTokenizer(command);
				com.nextToken();
				int numerPoziom = Integer.parseInt(com.nextToken());
				String pole;
				int[] wzor = new int[KAFLE_NA_SZER*KAFLE_NA_WYS];
				int i = 0;
				while ((pole=com.nextToken()) != null){
					wzor[i] = Integer.parseInt(pole);
					i++;
				}
				uaktualnijPoziom(numerPoziom, wzor);
			} else if (cd.equals(Protocol.MAPA_POZYCJA_KE)) {
		        uaktualnijPolozenieKe(Integer.parseInt(command.split(" ")[1]), Integer.parseInt(command.split(" ")[2]), Integer.parseInt(command.split(" ")[3]));   
			} else if (cd.equals(Protocol.MAPA_WRODZY_INFO)) {
				StringTokenizer com = new StringTokenizer(command);
				com.nextToken();
				int numerPoziom = Integer.parseInt(com.nextToken());
				int ilosc = Integer.parseInt(com.nextToken());
				int polozenieX = Integer.parseInt(com.nextToken());
				int polozenieY = Integer.parseInt(com.nextToken());
				uaktualnijPolozenieIloscWrog(numerPoziom,  ilosc,  polozenieX, polozenieY);
			} else if (cd.equals(Protocol.MAPA_CZAS)) {
				uaktualnijCzas(Integer.parseInt(command.split(" ")[1]),Integer.parseInt(command.split(" ")[2]));
			} else if (cd.equals(Protocol.MAPA_NIE_MAM_POZIOMU)) {
				//to dupa, nie wiem co zrobic
			} else if (cd.equals(Protocol.PUNKTACJA_TO)) {
				uaktualnijPunktacja(Integer.parseInt(command.split(" ")[1]), Integer.parseInt(command.split(" ")[2]), Integer.parseInt(command.split(" ")[3]), Integer.parseInt(command.split(" ")[4]));
			} else if (cd.equals(Protocol.KE_WYLOGOWALEM)) {
				return false;
			} else if (cd.equals(Protocol.KE_KONCZE)) {
				send(Protocol.KE_PRZYJALEM_KONIEC);
				return false;
			} else if (command.equals(Protocol.NULLCOMMAND)) {
				
	        }
	        
	        return true;
	    }


	    void send(String command) {
	        if (output != null) {
	        	System.out.println("K: " + command);
	        	output.println(command);

	        }
	            
	    }

	    synchronized void forceLogout() {
	        if (socket != null)
	            send(Protocol.KE_WYLOGUJ);
	    }
	    
	    
	    
	    
	    private void uaktualnijPredkoscKe(double predkosc){
	    	
	    }
	    private void uaktualnijPredkoscWrog(double predkosc){
	    	
	    }
	    private void uaktualnijIloscZyc(int ilosc){
	    	
	    }
	    private void uaktualnijTopLista(Map topLista){
	    	/*String wynikiHtml = new String("");
	    	for(int i=1; i<=topLista.size();i++){
        		wynikiHtml =wynikiHtml + i +". "+ topLista.get(i)+"<br>";
        	}
	    	okno.toplista.zawartosc = "<html><center>"
	    	           + "<font size=6 face=Sans color=white><br><Br><b>TOPLISTA: </b><br><br>"+
	    				wynikiHtml+"<br></font></center></html>";
	    				*/
	    }
	    private void uaktualnijPolozenieKe(int numer, int x, int y){
	    	
	    }
	    private void uaktualnijPolozenieIloscWrog(int numer, int ilosc, int polozenieX, int polozenieY){
	    	
	    }
	    private void uaktualnijPoziom(int numer, int [] wzor){
	    	
	    }
	    private void uaktualnijCzas(int numer, int czas){
	    	
	    }
	    private void uaktualnijPunktacja(int kulka, int sekunda, int wrog, int zycie){
	    	
	    }
	    
	    
	    public void zapytajPredkosc(){
	    	send(Protocol.PARAM_JAKIE_PREDKOSCI);
	    }
	    public void zapytajIloscZyc(){
	    	send(Protocol.PARAM_ILE_ZYC);
	    }
	    public void zapytajTopLista(){
	    	send(Protocol.TOP_LISTA_JAKA);
	    }
	    public void zapytajPoziom(int numer){
	    	send(Protocol.MAPA_DAJ_POZIOM + " " + numer);
	    }
	    public void zapytajPozycjaKe(int numer){
	    	send(Protocol.MAPA_JAKA_POZYCJA_KE + " " + numer);
	    }
	    public void zapytajPozycjaWrog(int numer){
	    	send(Protocol.MAPA_WRODZY_ILE_GDZIE + " " + numer);
	    }
	    public void zapytajCzas(int numer){
	    	send(Protocol.MAPA_JAKI_CZAS + " " + numer);
	    }
	    public void zapytajPunktacja(){
	    	send(Protocol.PUNKTACJA_JAKA);
	    }

}
